Conversation
WWWcool
left a comment
There was a problem hiding this comment.
Не понял в какой момент происходит добавление реккурентного токена к карте/кастумеру - это по идее на получение от провайдера должно работать, но кода нет. Тестов мало, нужен тесты на каскад и подтверждением работы
| CustomerID = <<"test-customer-42">>, | ||
| RecurrentParent = ?recurrent_parent(Invoice1ID, Payment1ID), | ||
| BaseParams = make_recurrent_payment_params(true, RecurrentParent, ?pmt_sys(<<"visa-ref">>)), | ||
| Payment2Params = BaseParams#payproc_InvoicePaymentParams{customer_id = CustomerID}, |
There was a problem hiding this comment.
а если не передать парент реккурент - сохранится?
There was a problem hiding this comment.
Добавил тест. Сохранится.
| {genlib, {git, "https://github.com/valitydev/genlib.git", {tag, "v1.1.0"}}}, | ||
| {woody, {git, "https://github.com/valitydev/woody_erlang.git", {tag, "v1.1.1"}}}, | ||
| {damsel, {git, "https://github.com/valitydev/damsel.git", {tag, "v2.2.27"}}}, | ||
| {damsel, {git, "https://github.com/valitydev/damsel.git", {branch, "BG-834/customer_payment"}}}, |
| {ok, Customer} = call(customer_management, 'Create', {#customer_CustomerParams{party_ref = PartyConfigRef}}), | ||
| Customer. |
There was a problem hiding this comment.
ключа идемпотентности нет, в параметрах создания нет привязки, значит если что то пойдет не так - у тебя будет миллиард пустых кастумеров
There was a problem hiding this comment.
Например создание и сразу привязка к платежу? А если платеж не успешен? Я думал чтобы список платежей в кастомере был списком успешных платежей
There was a problem hiding this comment.
это все верно, но после создания может же быть проблема - а можно делать чтобы у тебя в случае если не было кастумера и нужно создать ты мог в рамках транзакции создать, добавить карту и добавить реккурент - при этом проверяя не было ли уже их - чтобы не было дублей?
There was a problem hiding this comment.
Карты и токены добавляются идемпотентно, в этом плане проблем нет
There was a problem hiding this comment.
Идемпотентностью создания самого кастомера (это будет происходить в капи) займется бендер на основе ExternalID
| #customer_RecurrentToken{ | ||
| id = <<"parent">>, | ||
| provider_ref = ProviderRef, | ||
| terminal_ref = TerminalRef, | ||
| token = RecToken, | ||
| created_at = CreatedAt, | ||
| status = {active, #customer_RecurrentTokenActive{}} | ||
| }. |
There was a problem hiding this comment.
звучит странно - ты его делаешь, но в кубасити его нет, кто то кро прочитает события пойдет спрашивать что то по ним, а там ничего
There was a problem hiding this comment.
то есть сама идея что нужно учесть родительский вроде ок
| payment = #domain_InvoicePayment{ | ||
| id = PaymentID, | ||
| make_recurrent = true, | ||
| customer_id = CustomerID, |
There was a problem hiding this comment.
а если кастумера не было мб создать?
There was a problem hiding this comment.
Это будет происходить на уровне капи
There was a problem hiding this comment.
но у тебя же есть проверка - when CustomerID =/= undefined - то есть ты предполагаешь что такой вариант возможен - а я как раз на него и пишу - что не создать ли в таком случае?
There was a problem hiding this comment.
Это sanity check проверка. Могут быть сценарии в который мы не хотим ассоциировать платеж с кастомером, потому он не передается. Например этот функционал кому-то конкретно не нужен. Тогда для него создаваться не будет. Но пусть это решает бордер, а не сам ХГ.
There was a problem hiding this comment.
так это вопрос тогда к логике - кто управляет созданием - только фронт дает сигнал или мы сами создаем - у меня было ощущение что нам нужно агрегаты эти заводить в любом случае, а если сверху кто то спросил - условно есть ли у этого реккурента ассоциированный кастумер - отдать готового
| T; | ||
| error -> | ||
| %% Cascade route without pre-existing token — use parent's token | ||
| get_recurrent_token(get_payment_state(InvoiceID, PaymentID)) |
There was a problem hiding this comment.
а если это токен другого провайдера?
There was a problem hiding this comment.
Убрал этот кейс. Его не может быть.
| {ok, Customer} = call(customer_management, 'Create', {#customer_CustomerParams{party_ref = PartyConfigRef}}), | ||
| Customer. |
There was a problem hiding this comment.
это все верно, но после создания может же быть проблема - а можно делать чтобы у тебя в случае если не было кастумера и нужно создать ты мог в рамках транзакции создать, добавить карту и добавить реккурент - при этом проверяя не было ли уже их - чтобы не было дублей?
| CID =/= undefined | ||
| -> | ||
| case hg_customer_client:get_recurrent_tokens(InvID, PmtID) of | ||
| [_ | _] = Tokens -> [?cascade_tokens_loaded(Tokens)]; |
There was a problem hiding this comment.
а есть же length для длинны массива
| ParentToken = make_parent_recurrent_token(ParentSt), | ||
| AllTokens = [ParentToken | CubastyTokens], | ||
| [?cascade_tokens_loaded(AllTokens)]; | ||
| case {InheritedCustomerID, PayerParams} of |
There was a problem hiding this comment.
что то метание вышло - то есть если у нас есть реккурент родительский, но его еще нет в кубасити, то мы его никак не обрабатываем? а почему прогрев базы не делать таким образом?
There was a problem hiding this comment.
Потому что тогда нам надо прогревать еще и всех детей родителя (сколько их?). Я не уверен что этим стоит заниматься посреди проведения платежа
| case (get_payment(ParentPayment))#domain_InvoicePayment.customer_id of | ||
| CustomerID -> CustomerID; | ||
| undefined -> CustomerID; | ||
| _Other -> throw(#payproc_InvalidRecurrentParentPayment{details = <<"Customer ID mismatch with parent">>}) |
There was a problem hiding this comment.
я так и не понял пока нафиг этот кастумер передается сверху, если ты его можешь определять по родительскому платежу?
There was a problem hiding this comment.
Чем отличается родительский платеж от неродительского? И там и там мы можем передать CustomerID, InvoicePaymentParams один и тот же.
| payment = #domain_InvoicePayment{ | ||
| id = PaymentID, | ||
| make_recurrent = true, | ||
| customer_id = CustomerID, |
There was a problem hiding this comment.
но у тебя же есть проверка - when CustomerID =/= undefined - то есть ты предполагаешь что такой вариант возможен - а я как раз на него и пишу - что не создать ли в таком случае?
No description provided.